package practice5;

import java.util.Scanner;

public class P8624 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int mod= (int) (1e9+7);
        int n=sc.nextInt();
        int m=sc.nextInt();
        boolean[][] isReject=new boolean[7][7];     //表示i,j直间是否互斥,true表示互斥
        for(int i=0;i<m;i++){
            int a=sc.nextInt();
            int b=sc.nextInt();
            isReject[a][b]=true;
            isReject[b][a]=true;
        }
        long[][] dp = new long[n+1][7];     //dp[i][j]表示i个骰子，最顶部数字为j时最多能有多少种摆法
        for(int i=1;i<=6;i++){
            dp[1][i]=4;
        }

        for(int i=2;i<=n;i++){
            for(int j=1;j<=6;j++){
                int bottom=j+3>6?(j+3)%6:j+3;        //顶部为j时对应的底部数字
                for(int k=1;k<=6;k++){
                    if(!isReject[bottom][k]){       //底部数字不互斥的数字
                        dp[i][j]=(dp[i][j]+dp[i-1][k]*4)%mod;
                    }
                }
            }
        }

        long ans=0;
        for(int i=1;i<=6;i++){
            ans+=dp[n][i];
        }
        System.out.println(ans%mod);
    }
}
